package org.enhance.limiting.demo.jmh;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.springframework.context.event.EventListener;
import org.springframework.transaction.event.TransactionalEventListener;

import java.util.concurrent.TimeUnit;

/**
 * 测试jmh
 *
 * @author wenpanfeng 2022/08/02 15:14
 */
public class TestJmh {
    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                // 测试这个类的所有方法
                .include(TestJmh.class.getSimpleName())
//                .include(BenchMarkUsage.class.getSimpleName()+".*measureThroughput*")
                // 预热3轮
                .warmupIterations(3)
                // 度量5轮
                .measurementIterations(5)
                .forks(1)
                .build();

        new Runner(opt).run();
    }


    /**
     * Throughput的意思是整体吞吐量，表示给定的时间内执行的次数。
     * <p>
     * OutputTimeUnit(TimeUnit.SECONDS)来指定时间单位。
     * value表示该benchMark执行多少次，warmups表示fork多少个进程来执行。iterations表示warmup的iterations个数
     */
    @EventListener
    @TransactionalEventListener
    @Fork(value = 1, warmups = 2)
    @Warmup(iterations = 5)
    @Benchmark
    @BenchmarkMode(Mode.Throughput)
    @OutputTimeUnit(TimeUnit.SECONDS)
    public void measureThroughput() throws InterruptedException {
        TimeUnit.MILLISECONDS.sleep(100);
    }

}